/**
 * common.js 「(非公式)ニコニコ実況サポーター」共通スクリプト
 * @author winter.daydreams@gmail.com (satmat twitter:satellitesat)
 */

var SATMAT_NICOJK = SATMAT_NICOJK || {};


/**
 * 名前空間生成関数
 * @param {String} ns_string 追加したい名前空間.
 */
SATMAT_NICOJK.namespace = function(ns_string) {
  'use strict';
  var parts = ns_string.split('.'),
      parent = SATMAT_NICOJK,
      i,
      max;

  if (parts[0] === 'SATMAT_NICOJK') {
    parts = parts.slice(1);
  }

  for (i = 0, max = parts.length; i < max; i += 1) {
    if (typeof parent[parts[i]] === 'undefined') {
      parent[parts[i]] = {};
    }
    parent = parent[parts[i]];
  }
  return parent;
};


/**
 @class 共通の定義
 */
SATMAT_NICOJK.namespace('SATMAT_NICOJK.DEFS');
SATMAT_NICOJK.DEFS = (function() {
  'use strict';
  return{
    NICOJK_BASE_URL: 'http://jk.nicovideo.jp',
    EPGMEMORY_BASE_URL: 'http://timetable.yanbe.net'
  };
}());


/**
 @class 便利関数たち
 */
SATMAT_NICOJK.namespace('SATMAT_NICOJK.util');
SATMAT_NICOJK.util = (function() {
  'use strict';
  return {


    /**
     * 整数を文字列化する関数。
     * 1桁の整数を渡した場合、0を付けて2桁にして返す。
     * @param [in] {Number} n  整数.
     * @return {String} 整数を文字列化したもの.
     */
    toTwoDigits: function(n) {
      var d_str = '';

      if (n < 10) {
        d_str = ('0' + n.toString());
      } else {
        d_str = n.toString();
      }
      return d_str;
    },


    /**
     イコール(=)で結合されたクエリ文字列を、キーと値の連想配列（オブジェクト）に変換する。
     @param [in] {String} str  クエリ文字列(ex. key1=val2&key2&val2).
     @return {Object} クエリ文字列を連想配列に変換したオブジェクト (ex. {key1:'val1', key2:'val2'} ).
     */
    queryString2Array: function(str) {
      var qsplit = null,
          pair = null,
          qarray = new Array();

      if (!str) {
        console.error('string is null.');
        return null;
      }

      qsplit = str.split('&');
      for (var i = 0; qsplit.length > i; i++) {
        pair = qsplit[i].split('=');
        if (pair[0] != '') {
          qarray[pair[0]] = decodeURIComponent(pair[1]);
        }
      }
      return qarray;
    },


    /**
     * ymd形式の文字列を、Dateオブジェクトに変換する。
     * @param [in] {String} ymd_str ymd形式文字列.
     * @return {Date} ymd形式文字列をDateに変換したオブジェクト(正常終了).
     * @return {null} ymd_strがymd形式の文字列でない場合はnull.
     */
    ymdStr2Date: function(ymd_str) {
      var str_len = 0,
          add_zero_len = 0,
          i = 0;

      if (typeof ymd_str !== 'string') {
        return null;
      }

      /* 8桁以上14桁未満の数字ではない */
      if (ymd_str.search(/^\d{8,14}$/) === -1) {
        return null;
      }

      /* 指定されなかった下位の桁はゼロで埋める  */
      str_len = ymd_str.length;
      add_zero_len = 14 - str_len;
      for (i = 0; i < add_zero_len; i++) {
        ymd_str.concat('0');
      }

      //console.log(ymd_str);

      return new Date(ymd_str.substring(0, 4),
                      ymd_str.substring(4, 6) - 1, /* Dateクラスの月は0-11で表記  */
                      ymd_str.substring(6, 8),
                      ymd_str.substring(8, 10),
                      ymd_str.substring(10, 12),
                      ymd_str.substring(12, 14));
    },

    /**
     * 「テレビ番組表の記録」のchidを放送局情報に変換する。<br />
     * テーブル表から生成できないため、本関数で決め打ちにより<br />
     * ニコニコ実況に存在する番組のみ対応。<br />
     * @param {String} chid 3桁番号.
     */
    chid2bcinfo: function(chid) {
      var bcinfo = {
        /* 東京・地上波1 */
        101101024: {bcname: 'ＮＨＫ総合・東京', jknum: 'jk1'},
        102101032: {bcname: 'ＮＨＫＥテレ１・東京', jknum: 'jk2'},
        103101034: {bcname: 'ＮＨＫＥテレ３・東京', jknum: 'jk'},
        104101040: {bcname: '日テレ', jknum: 'jk4'},
        105101064: {bcname: 'テレビ朝日', jknum: 'jk5'},
        106101048: {bcname: 'ＴＢＳ', jknum: 'jk6'},
        107101072: {bcname: 'テレビ東京', jknum: 'jk7'},
        108101056: {bcname: 'フジテレビ', jknum: 'jk8'},
        109123608: {bcname: 'ＴＯＫＹＯ　ＭＸ１', jknum: 'jk9'},
        110123609: {bcname: 'ＴＯＫＹＯ　ＭＸ２', jknum: 'jk'},
        104129752: {bcname: 'テレ玉', jknum: 'jk10'},
        104124632: {bcname: 'ｔｖｋ', jknum: 'jk11'},
        104127704: {bcname: 'チバテレビ', jknum: 'jk12'},
        111101088: {bcname: '放送大学１', jknum: 'jk'},
        112101089: {bcname: '放送大学２', jknum: 'jk'},
        113101090: {bcname: '放送大学３', jknum: 'jk'},

        /* BS1 */
        101200101: {bcname: 'ＮＨＫ ＢＳ１', jknum: 'jk101'},
        102200103: {bcname: 'ＮＨＫ ＢＳプレミアム', jknum: 'jk103'},
        103200141: {bcname: 'ＢＳ日テレ', jknum: 'jk141'},
        104200151: {bcname: 'ＢＳ朝日', jknum: 'jk151'},
        105200161: {bcname: 'ＢＳ-ＴＢＳ', jknum: 'jk161'},
        106200171: {bcname: 'ＢＳジャパン', jknum: 'jk171'},
        107200181: {bcname: 'ＢＳフジ', jknum: 'jk181'},
        108200191: {bcname: 'ＷＯＷＯＷプライム', jknum: 'jk191'},
        109200192: {bcname: 'ＷＯＷＯＷライブ', jknum: 'jk192'},
        110200193: {bcname: 'ＷＯＷＯＷシネマ', jknum: 'jk193'},
        111200200: {bcname: 'スター・チャンネル１', jknum: 'jk200'},
        112200201: {bcname: 'スター・チャンネル２', jknum: 'jk201'},
        113200202: {bcname: 'スター・チャンネル３', jknum: 'jk202'},
        114200211: {bcname: 'ＢＳ１１', jknum: 'jk211'},
        115200222: {bcname: 'ＴｗｅｌｌＶ', jknum: 'jk222'},
        116200231: {bcname: '放送大学BS1', jknum: 'jk231'},
        117200232: {bcname: '放送大学BS2', jknum: 'jk'},
        118200233: {bcname: '放送大学BS3', jknum: 'jk'},
        119200234: {bcname: 'グリーンチャンネル', jknum: 'jk234'},
        120200236: {bcname: 'BSアニマックス', jknum: 'jk236'},
        121200238: {bcname: 'FOXbs238', jknum: 'jk238'},
        122200241: {bcname: 'BSスカパー!', jknum: 'jk241'},
        123200242: {bcname: 'J SPORTS 1', jknum: 'jk242'},
        124200243: {bcname: 'J SPORTS 2', jknum: 'jk243'},
        125200244: {bcname: 'J SPORTS 3', jknum: 'jk244'},
        126200245: {bcname: 'J SPORTS 4', jknum: 'jk245'},
        127200251: {bcname: 'BS釣りビジョン', jknum: 'jk251'},
        128200252: {bcname: 'IMAGICA', jknum: 'jk252'},
        129200255: {bcname: 'BS日本映画専門チャンネル', jknum: 'jk255'},
        130200256: {bcname: 'ディズニー・チャンネル', jknum: 'jk256'},
        131200258: {bcname: 'Dlife', jknum: 'jk258'},
        133200910: {bcname: 'SOLiVE24', jknum: 'jk910'}
      };

      return bcinfo[chid];
    },


    /** 「過去番組表の記録」番組表ページURLを、date_objからの相対日時で取得する関数.
     * @param {Number} day_offset 今日からの相対日時<br />
     * 例： -1=昨日 0=今日 +1=明日.
     * @param {Date} date_obj 基準にする日時。省略すると今日の日付を基準にする.
     * @return {String} 「過去番組表の記録」番組表ページURL文字列.
     *  */
    getEpgmemoryAnchorStr: function(day_offset, date_obj) {
      var util = SATMAT_NICOJK.util,
          date = new Date(),
          year = 0,
          month = 0,
          day = 0,
          hour = 0,
          url_str = '';

      if (typeof day_offset !== 'number') {
        throw new Error('\'day_offset\'が数字ではない.', day_offset);
      }

      if (date_obj !== null &&
          typeof(date_obj) !== 'undefined') { /* 第2引数が指定された場合 */

        if (typeof(date_obj.setTime) === 'function' && /* Dateオブジェクトかどうか確認する */
            typeof(date_obj.getTime) === 'function') {

          date = new Date(date_obj.getTime());
        } else { /* 第2引数は指定されたがDateオブジェクトでない */
          throw new Error('第2は引数は指定されたがDateオブジェクトではない', date_obj);
        }
      }

      date.setTime(date.getTime() +
                   day_offset * 60 * 60 * 24 * 1000); /* 日付の調節 */

      year = date.getFullYear().toString();
      month = util.toTwoDigits(date.getMonth() + 1);
      hour = util.toTwoDigits(date.getHours());       /* 日にちの判定処理に使う */
      if (0 <= hour && hour < 5) {                     /* 0-4時は前の日の日付として扱う */
        day = util.toTwoDigits(date.getDate() - 1);
      }else {
        day = util.toTwoDigits(date.getDate());
      }

      url_str = 'http://timetable.yanbe.net/html/13/' +
                    year + '/' + month + '/' + day + '_1.html?13';

      console.log(url_str);
      return url_str;
    }


  };
}());

